匷ãåä»ããæŽ»çšããããšã§ãåå®å šãªæå·åã®ååãšå®è·µãæ¢æ±ããæå·ã·ã¹ãã ãããå®å šã§ä¿¡é Œæ§ãé«ããäžè¬çãªè匱æ§ã«å¯ŸããŠãèæ§ãæã€ããã«ããŸãã
åå®å šãªæå·å: 匷ãåä»ããçšããæå·ã·ã¹ãã ã®å®è£
æå·æè¡ã®äžçã§ã¯ãã»ãã¥ãªãã£ãæéèŠã§ããå ç¢ãªæå·ã·ã¹ãã ãå®è£ ããã«ã¯çްéšãžã®çްå¿ã®æ³šæãå¿ èŠã§ãããããããªãšã©ãŒã§ãã壿» çãªè匱æ§ã«ã€ãªããå¯èœæ§ããããŸããæå·ã®ã»ãã¥ãªãã£ã匷åããã¢ãããŒãã®1ã€ãåå®å šãªæå·åã§ããããã¯ããã°ã©ãã³ã°èšèªã®åã·ã¹ãã ã®åãæŽ»çšããŠå¶çŽã課ããæå·ã³ãŒãã«ãããäžè¬çãªãšã©ãŒã鲿¢ããŸãã
åå®å šãªæå·åãšã¯ïŒ
åå®å šãªæå·åãšã¯ã匷ãåä»ãã䜿çšããŠç¹å®ã®ã»ãã¥ãªãã£ç¹æ§ãä¿èšŒããæå·å®è£ ã®ã¢ãããŒãã§ããæ¬è³ªçã«ãããã¯ããã°ã©ãã³ã°èšèªã®åã·ã¹ãã ã䜿çšããŠã以äžã®ãããªæå·ã®äžå€æ§ã匷å¶ããããšã§ãã
- ããŒã¿ä¿å šæ§: æå·åãŸãã¯è»¢éäžã«ããŒã¿ãæ¹ãããããŠããªãããšãä¿èšŒããŸãã
- æ©å¯æ§: æ¿èªãããåœäºè ã®ã¿ãæå·åãããããŒã¿ã埩å·ã§ããããšãä¿èšŒããŸãã
- æ£ããéµã®äœ¿çšæ³: éµãæå³ãããç®çã«äœ¿çšãããããšïŒäŸ: æå·åéµãæå·åã®ã¿ã«äœ¿çšãã埩å·ã«ã¯äœ¿çšããªãããšïŒãä¿èšŒããŸãã
- é©åãªåæå: æå·ããªããã£ããé©åãªãã©ã¡ãŒã¿ãšä¹±æ°ãçšããŠæ£ããåæåãããããšã確èªããŸãã
åŸæ¥ã®æå·å®è£ ã§ã¯ããããã®ç¹æ§ã匷å¶ããããã«æåãã§ãã¯ãå®è¡ææ€èšŒã«äŸåããããšããããããŸãããããããã®ã¢ãããŒãã¯ãšã©ãŒãçºçããããã§ããäžæ¹ãåå®å šãªæå·åã¯ãã³ãŒããå®è¡ãããåã«ãã³ã³ãã€ã«æã«ãããã®ãšã©ãŒãææããããšãç®æããŸããããã«ãããã»ãã¥ãªãã£è匱æ§ãå°å ¥ãããªã¹ã¯ãåçã«æžå°ããŸãã
åå®å šãªæå·åã®å©ç¹
åå®å šãªæå·åã¯ãåŸæ¥ã®æå·ããã°ã©ãã³ã°ã«æ¯ã¹ãŠããã€ãã®éèŠãªå©ç¹ãæäŸããŸãã
- ã»ãã¥ãªãã£ã®åäž: ã³ã³ãã€ã«æã«ãšã©ãŒãææããããšã§ãåå®å šãªæå·åã¯æ»æè ã«ãã£ãŠæªçšãããå¯èœæ§ã®ããå®è¡æè匱æ§ã®ãªã¹ã¯ã軜æžããŸãã
- ä¿¡é Œæ§ã®åäž: åã·ã¹ãã ã¯æå·ã³ãŒããããå ç¢ã§ä¿¡é Œæ§ãé«ããªãããšãä¿èšŒããäºæããªãåäœãã¯ã©ãã·ã¥ã®å¯èœæ§ãäœæžããŸãã
- éçºæéã®ççž®: åæèšå®ã«ã¯ããå€ãã®æ€èšãå¿ èŠãããããŸããããåå®å šãªæå·åã¯ãæ©æã«ãšã©ãŒãææããåŸã®ã³ã¹ãã®ããããããã°äœæ¥ãé²ãããšã§ãæçµçã«éçºæéãççž®ã§ããŸãã
- ä¿å®æ§ã®åäž: åã·ã¹ãã ãã³ãŒãã®æå³ãããåäœãæç¢ºã«ææžåãããããåå®å šãªã³ãŒãã¯ãã°ãã°çè§£ãããããä¿å®ã容æã«ãªããŸãã
- ã³ãŒãã®æç¢ºæ§ã®åäž: åã¢ãããŒã·ã§ã³ã¯äžçš®ã®ããã¥ã¡ã³ããšããŠæ©èœããã³ãŒããçè§£ãããã®æ ¹æ ãèããããšã容æã«ããŸãã
åå®å šãªæå·åã®ä»çµã¿
åå®å šãªæå·åã¯ãããã€ãã®äž»èŠãªååã«åºã¥ããŠããŸãã
1. 匷ãåä»ã
匷ãåä»ããšã¯ãããã°ã©ãã³ã°èšèªãç°ãªãæäœã§äœ¿çšã§ããããŒã¿ã®åã«ã€ããŠå³æ Œãªã«ãŒã«ã匷å¶ããããšãæå³ããŸãã匷ãåä»ãã®èšèªã§ã¯ãã³ã³ãã€ã©ã¯ãããã®ã«ãŒã«ã«éåããã³ãŒããæåŠããå€ãã®äžè¬çãªãšã©ãŒãé²ããŸãã
äŸãã°ãç§å¯éµã䜿çšããŠããŒã¿ãæå·åãã颿°ãèããŠã¿ãŸããããåå®å
šãªå®è£
ã§ã¯ããã®é¢æ°ã¯EncryptionKeyã®ãããªç¹å®ã®åã®éµãåãåãããã«å®£èšããããããããŸããããããšã³ã³ãã€ã©ã¯ããã®åã®å€ã®ã¿ã颿°ã«æž¡ãããããšãä¿èšŒããäžæ£ç¢ºãªéµã®åïŒäŸãã°ã埩å·éµïŒã®äœ¿çšãé²ããŸãã
2. 代æ°çããŒã¿å (ADT)
代æ°çããŒã¿å (ADT) ã¯ãç°ãªã圢åŒãåãããšãã§ããããŒã¿åãå®çŸ©ããããšãå¯èœã«ããŸããããã¯ãæå·æãå¹³æãéµãªã©ã®æå·ããªããã£ãã衚çŸããã®ã«ç¹ã«åœ¹ç«ã¡ããããããç¬èªã®ç¹å®ã®ããããã£ãæã£ãŠããŸãã
äŸãã°ã䜿çšãããæå·ã¢ã«ãŽãªãºã ãšåæåãã¯ãã« (IV) ã«é¢ããæ å ±ãå«ãæå·æçšã®ADTãå®çŸ©ã§ããŸããããã«ãããåã·ã¹ãã ã¯ãã®æ å ±ã远跡ããåŸ©å·æã«ãããæ£ãã䜿çšãããããšãä¿èšŒã§ããŸãã
3. ãã¡ã³ãã å
ãã¡ã³ãã åã¯ãåã®å®è¡æè¡šçŸã«ã¯çŸããªãåãã©ã¡ãŒã¿ã§ãããããã¯ãã³ã³ãã€ã«æã«ã®ã¿é¢é£ããåã«é¢ããè¿œå æ å ±ããšã³ã³ãŒãããããã«äœ¿çšã§ããŸããããã¯ãéµã®äœ¿çšæ³ãããŒã¿ã®åºæãªã©ã®ããããã£ã远跡ããã®ã«åœ¹ç«ã¡ãŸãã
äŸãã°ãéµãæå·åçšã埩å·çšãã瀺ãããã«ãã¡ã³ãã åã䜿çšã§ããŸããããã«ãããã³ã³ãã€ã©ã¯åŸ©å·éµã誀ã£ãŠæå·åã«äœ¿çšãããããã®éãé²ãããšãã§ããŸãã
4. ç·åœ¢å
ç·åœ¢åã¯ããªãœãŒã¹ãæ£ç¢ºã«äžåºŠã ã䜿çšãããããšãä¿èšŒããŸããããã¯ãã¡ã¢ãªç®¡çãæ©å¯æ§ã®é«ãæå·æäœã«ãšã£ãŠéåžžã«åœ¹ç«ã¡ãŸããäŸãã°ãéµã¯äœæãããåäžã®æå·å/åŸ©å·æäœã«äœ¿çšãããåŸãå®å šã«ç Žæ£ãããããšã§ã鵿ŒæŽ©ã®ãªã¹ã¯ãæå°éã«æããããŸãã
5. äŸåå
äŸååã¯ãããå€ã®åãå¥ã®é ã®å€ã«äŸåããããšãå¯èœã«ããŸããæå·æè¡ã«ãããŠã¯ãããã«ããéµã®ãµã€ãºãã¡ãã»ãŒãžã®é·ãããŸãã¯ãã³ã¹ã®èš±å®¹ç¯å²ãšãã£ãããããã£ãåã·ã¹ãã èªäœã®äžã§æå®ã§ããŸããããã«ãããæå·ã®äžå€æ§ã®éåžžã«åŒ·åãªéçæ€èšŒãå¯èœã«ãªããæ»æã®ã¯ã©ã¹å šäœãé²ãããšãã§ããŸãã
å®è·µã«ãããåå®å šãªæå·åã®äŸ
ããã€ãã®ããã°ã©ãã³ã°èšèªãšã©ã€ãã©ãªã¯ãåå®å šãªæå·åããµããŒãããŠããŸãã以äžã«ããã€ãã®äŸã瀺ããŸãã
1. Haskell
Haskellã¯ããã®åŒ·åãªåã·ã¹ãã ãšADTããã³ãã¡ã³ãã åãžã®ãµããŒãã«ãããåå®å
šãªæå·ã·ã¹ãã ãå®è£
ããããã®äººæ°ã®ããèšèªã§ããäŸãã°ãcryptoniteã©ã€ãã©ãªã¯ãåå®å
šãªæ¹æ³ã§äœ¿çšãããããã«èšèšãããå¹
åºãæå·ããªããã£ããæäŸããŸãã
äŸïŒæŠå¿µïŒ:
data EncryptionKey
data DecryptionKey
data Ciphertext algorithm iv = Ciphertext ByteString
encrypt :: EncryptionKey -> ByteString -> Ciphertext AES256 GCM
decrypt :: DecryptionKey -> Ciphertext AES256 GCM -> Maybe ByteString
-- åã¯ã埩å·éµã§ã®æå·åããŸãã¯æå·åéµã§ã®åŸ©å·ãé²ããŸãã
2. Rust
Rustã®æææš©ãšåçšã·ã¹ãã ã¯ããã®åŒ·åãªåã·ã¹ãã ãšçžãŸã£ãŠãåå®å šãªæå·åã®ããäžã€ã®åªããéžæè¢ãšãªã£ãŠããŸããRustã®ãŒãã³ã¹ãæœè±¡åã¯ãå®å šã§å¹ççãªæå·å®è£ ãå¯èœã«ããŸãã
äŸïŒæŠå¿µïŒ:
struct EncryptionKey;
struct DecryptionKey;
struct Ciphertext { algorithm: String, iv: Vec, data: Vec }
fn encrypt(key: &EncryptionKey, plaintext: &[u8]) -> Ciphertext { /* ... */ }
fn decrypt(key: &DecryptionKey, ciphertext: &Ciphertext) -> Option> { /* ... */ }
//Rustã®åçšãã§ãã«ãŒã¯äžè¬çãªè匱æ§ãé²ãã®ã«åœ¹ç«ã¡ãŸã
3. Vale
Valeã¯ãã¡ã¢ãªå®å šæ§ãšäžŠè¡æ§ã念é ã«çœ®ããŠæç€ºçã«èšèšãããã·ã¹ãã èšèªã§ãã寿åœããªãŒãžã§ã³ãæ©èœãªã©ã®æŠå¿µã䜿çšããŠããããããã¯æå·éµãšãããã¡ã®å®å šãªäœ¿çšã確ä¿ãããããã¡ãªãŒããŒãããŒãuse-after-freeãšã©ãŒãªã©ã®ã¡ã¢ãªç Žæè匱æ§ãé²ãã®ã«éåžžã«åœ¹ç«ã¡ãŸãã
4. ç¹æ®ãªæå·ã©ã€ãã©ãª
äžéšã®æå·ã©ã€ãã©ãªã¯ãåºç€ãšãªãèšèªã匷ãåä»ããæäŸããŠããªãå Žåã§ããåå®å šæ§ã念é ã«çœ®ããŠèšèšãããŠããŸãããããã®ã©ã€ãã©ãªã¯ããã°ãã°æ¬¡ã®ãããªææ³ã䜿çšããŸãã
- ã¿ã°ä»ãå: éµãæå·æãå¹³æãªã©ãç°ãªãçš®é¡ã®æå·ããŒã¿ã衚çŸããããã«åå¥ã®åã䜿çšããŸãã
- ãã§ãã¯ãããæäœ: æäœãæå¹ã§ãããããŒã¿ãæ£ãã䜿çšãããŠããããšã確èªããããã«ãå®è¡æãã§ãã¯ãå®è¡ããŸãã
- å¶éãããã€ã³ã¿ãŒãã§ãŒã¹: å®å šãã€äºæž¬å¯èœãªæ¹æ³ã§äœ¿çšãããããã«èšèšããããå¶éããã颿°ã»ãããæäŸããŸãã
課é¡ãšèæ ®äºé
åå®å šãªæå·åã¯å€ãã®å©ç¹ãæäŸããŸãããããã€ãã®èª²é¡ãæç€ºããŸãã
- è€éã: åå®å šãªæå·ã·ã¹ãã ã®å®è£ ã¯ãæå·æè¡ãšåã·ã¹ãã ã®äž¡æ¹ã«ã€ããŠããæ·±ãçè§£ãå¿ èŠãšãããããåŸæ¥ã®ã¢ãããŒããããè€éã«ãªãå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹: åãã§ãã¯ã¯ããããã®ãªãŒããŒããããå°å ¥ããå¯èœæ§ããããŸãããå®éã«ã¯ç¡èŠã§ããããšãå€ãã§ããããããæ³šææ·±ãèšèšãããåå®å šãªã³ãŒãã¯ãåŸæ¥ã®ã³ãŒããšåãããã髿§èœã«ãªãå¯èœæ§ããããŸãã
- èšèªã®å¶é: ãã¹ãŠã®ããã°ã©ãã³ã°èšèªãåå®å šãªæå·åã«é©ããŠããããã§ã¯ãããŸããã匱ãåã·ã¹ãã ãæã€èšèªããADTããã³ãã¡ã³ãã åã«å¯ŸãããµããŒããéãããŠããèšèªã¯ãå¿ èŠãªä¿èšŒãæäŸã§ããªãå ŽåããããŸãã
- æ¢åã·ã¹ãã ãšã®çµ±å: åå®å šãªæå·ã³ãŒãããåŸæ¥ã®ã¢ãããŒãã䜿çšããæ¢åã·ã¹ãã ãšçµ±åããããšã¯å°é£ãªå ŽåããããŸãã
- åŠç¿æ²ç·: é«åºŠãªåã·ã¹ãã ãçè§£ãå©çšããã«ã¯ããªãã®åŽåãå¿ èŠã§ãããããããã®åŠç¿ã¯ã»ãã¥ãªãã£ã ãã§ãªããäžè¬çãªã³ãŒãå質ãåäžããããããé·æçã«ã¯éåžžã«äŸ¡å€ããããŸãã
åå®å šãªæå·åã®ããã®ãã¹ããã©ã¯ãã£ã¹
åå®å šãªæå·åã广çã«å®è£ ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããã
- é©åãªèšèªã®éžæ: 匷ãåã·ã¹ãã ãæã¡ãADTããã¡ã³ãã åããã®ä»ã®åå®å šãªæ©èœãååã«ãµããŒãããããã°ã©ãã³ã°èšèªãéžæããŠãã ãããHaskellãRustãValeã¯åªããéžæè¢ã§ãã
- ä¿¡é Œã§ããæå·ã©ã€ãã©ãªã®äœ¿çš: ååã«æ€èšŒãããã¡ã³ããã³ã¹ãããŠãããåå®å šãªæ¹æ³ã§äœ¿çšãããããã«èšèšãããæå·ã©ã€ãã©ãªãéžæããŠãã ããã
- æç¢ºãªåã®å¢çã®å®çŸ©: éµãæå·æãå¹³æãªã©ã®æå·ããŒã¿ã®åãæç¢ºã«å®çŸ©ããã³ãŒãå šäœã§ãããã®åã匷å¶ããŠãã ããã
- éµã®äœ¿çšã远跡ããããã®ãã¡ã³ãã åã®äœ¿çš: éµãæå·åçšã埩å·çšãã远跡ããããã«ãã¡ã³ãã åã䜿çšããéµã誀ã£ãç®çã«èª€ã£ãŠäœ¿çšããããšãé²ãã§ãã ããã
- 宿çãªã³ãŒãã¬ãã¥ãŒã®å®æœ: çµéšè±å¯ãªæå·åŠè ãåã·ã¹ãã ã®ãšãã¹ããŒãã«ã³ãŒããã¬ãã¥ãŒããŠããããæœåšçãªè匱æ§ãç¹å®ããŠãã ããã
- 圢åŒçæ€èšŒã®æ€èš: éèŠãªã·ã¹ãã ã«ã€ããŠã¯ãã³ãŒããç¹å®ã®ã»ãã¥ãªãã£ç¹æ§ãæºããããšã蚌æããããã«åœ¢åŒçæ€èšŒæè¡ã®äœ¿çšãæ€èšããŠãã ãããCoqãF*ãªã©ã®ããŒã«ããã®ç®çã®ããã«èšèšãããŠããŸãã
- ã·ã³ãã«ã«å§ãã: ããããé«åºŠãªåä»ãæè¡ãäžåºŠã«é©çšããããšããªãã§ãã ãããéµã®åãæ±ããªã©ãã·ã¹ãã ã®æãéèŠãªåŽé¢ããå§ããæ®µéçã«åå®å šæ§ã®ååãé©çšããŠãã ããã
åå®å šãªæå·åã«é¢ããã°ããŒãã«ãªèŠç¹
å®å šãªæå·æè¡ã®éèŠæ§ã¯äžçäžã§èªèãããŠããŸããç°ãªãå°åãåœã¯ãããŒã¿ã»ãã¥ãªãã£ãšæå·åã«é¢ããŠããŸããŸãªèŠå¶ãšæšæºãæã£ãŠããŸããåå®å šãªæå·åãå®è£ ããããšã§ãçµç¹ã¯ãããã®èŠå¶ã«æºæ ãã顧客ãšã®ä¿¡é Œãç¯ãããšãã§ããŸãã
äŸãã°ã欧å·é£åã®äžè¬ããŒã¿ä¿è·èŠåïŒGDPRïŒã¯ãçµç¹ãå人ããŒã¿ãä¿è·ããããã«é©åãªã»ãã¥ãªãã£å¯Ÿçãå®è£ ããããšã矩åä»ããŠããŸããåå®å šãªæå·åã¯ããããã®èŠä»¶ãæºããããã®è²ŽéãªããŒã«ãšãªãåŸãŸãã
åæ§ã«ã峿 ŒãªããŒã¿ããŒã«ã©ã€ãŒãŒã·ã§ã³æ³ãæã€åœã ã§ã¯ãåå®å šãªæå·åã¯ãããŒã¿ãç°ãªãå Žæã«ä¿åãããŠããå Žåã§ãããã®æ©å¯æ§ãšå®å šæ§ã確ä¿ããã®ã«åœ¹ç«ã¡ãŸãã
æå·æè¡ã«å¯ŸããŠåå®å šãªã¢ãããŒããæ¡çšããããšã§ãçµç¹ã¯ã»ãã¥ãªãã£ãšãã©ã€ãã·ãŒãžã®ã³ãããã¡ã³ãã瀺ãããšãã§ããããã¯äžçäžã®é¡§å®¢ãããŒãããŒãšã®ä¿¡é Œãç¯ãäžã§äžå¯æ¬ ã§ãã
åå®å šãªæå·åã®æªæ¥
ããã°ã©ãã³ã°èšèªãšåã·ã¹ãã ãé²åãç¶ããã«ã€ããŠãåå®å šãªæå·åã¯ããæ®åããå¯èœæ§ãé«ãã§ããå®å šãªæå·ã·ã¹ãã ã®å®è£ ã容æã«ããæ°ããèšèªãšã©ã€ãã©ãªãç»å Žããã§ãããã圢åŒçæ€èšŒã®é²æ©ããæå·ã³ãŒãã®æ£ç¢ºæ§ãããé«ãä¿¡é Œæ§ã§èšŒæããããšãå¯èœã«ããã§ãããã
ããã«ãã»ãã¥ãªãã£è匱æ§ãžã®æèã®é«ãŸããšæå·ã·ã¹ãã ã®è€éåããåå®å šãªæå·åã®ãããªãæ¡çšãä¿é²ããã§ããããçµç¹ã¯ãã³ã³ãã€ã«æã«ãšã©ãŒãææããæå·ã³ãŒããå ç¢ã§ä¿¡é Œã§ãããã®ã§ããããšãä¿èšŒããããšã®å©ç¹ããŸããŸãèªèããããã«ãªãã§ãããã
å°æ¥çã«ã¯ãåå®å šãªæå·åã¯ãéçºè ããããå®å šã§ä¿¡é Œæ§ã®é«ãã·ã¹ãã ãæ§ç¯ããããã®æã广çãªæ¹æ³ã§ãããšèªèããã«ã€ããŠãæå·å®è£ ã®ããã©ã«ãã®ã¢ãããŒãã«ãªããããããŸããã
çµè«
åå®å šãªæå·åã¯ãæå·ã·ã¹ãã ã®ã»ãã¥ãªãã£ãšä¿¡é Œæ§ã匷åããããã®åŒ·åãªæè¡ã§ããåã·ã¹ãã ã®åãæŽ»çšããããšã§ãéçºè ã¯ã³ã³ãã€ã«æã«ãšã©ãŒãææããã³ãŒããéèŠãªã»ãã¥ãªãã£ç¹æ§ãæºããããšãä¿èšŒã§ããŸããããã€ãã®èª²é¡ãæç€ºããŸãããåå®å šãªæå·åã®å©ç¹ã¯ã³ã¹ããäžåããå®å šã§ä¿¡é Œæ§ã®é«ãã·ã¹ãã ãæ§ç¯ããããã®äžå¯æ¬ ãªããŒã«ãšãªããŸãã
ãã®èšäºã§æŠèª¬ãããŠãããã¹ããã©ã¯ãã£ã¹ã«åŸããããã°ã©ãã³ã°èšèªãšåã·ã¹ãã ã®ææ°ã®é²æ©ã«é ããã«ã€ããŠããããšã§ãéçºè ã¯åå®å šãªæå·åã广çã«å®è£ ããäžçäžã®ãŠãŒã¶ãŒã®ããã«ããå®å šã§ä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããäžçãæå·æè¡ãžã®äŸå床ãé«ããã«ã€ããŠãåå®å šãªæå·åã®éèŠæ§ã¯å¢ãç¶ããã§ãããã